package com.q.springboot.framework.Interceptor;

import com.q.springboot.framework.annotation.JwtToken;
import com.q.springboot.framework.exception.TokenException;
import com.q.springboot.framework.util.JwtUtil;
import com.q.springboot.framework.enums.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * @author ：qmf
 * @date ：Created in 2020/10/25 20:38
 * @description：token验证 拦截器
 * @modified By：
 */
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("token");// 从 http 请求头中取出 token
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Class<?> clazz = handlerMethod.getBeanType();
        Method method = handlerMethod.getMethod();

        //检查有没有需要用户权限的注解,方法和类有一个符合条件就验证
        if (clazz.isAnnotationPresent(JwtToken.class) || method.isAnnotationPresent(JwtToken.class)) {
            // 执行认证
            if (token == null) {
                throw new TokenException(ResultCode.TOKEN_NOT_EXISTS);
            }
            // 获取 token 中的 userId
            String userId = JwtUtil.getUserId(token);
            //数据库查询用户是否存在
//            User user = userService.findUserById(userId);
//            if (user == null) {
//                throw new CustomException(ResultCode.USER_NOT_EXIST);
//            }
            // 验证 token
            JwtUtil.checkToken(token);
            return true;
        }
        return true;
    }

}
